/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Estacionamento.DAOGenerico;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

/**
 *
 * @author italo.valenca
 */
public abstract class DAOGenerico<Entidade> implements IDAOGenerico<Entidade> {

//	protected EntityManager entityManager;
    protected Class<Entidade> classePersistente;

    @SuppressWarnings("unchecked")
    public DAOGenerico() {
        ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
        classePersistente = (Class<Entidade>) parameterizedType.getActualTypeArguments()[0];
    }

    public final void alterar(Entidade t) {
        try {
            getEntityManager().getTransaction().begin();
            getEntityManager().merge(t);
            getEntityManager().getTransaction().commit();
            getEntityManager().close();
            //System.out.println(classePersistente.getSimpleName() + " alterado com sucesso");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public final void cadastrar(Entidade t) {
        try {
            getEntityManager().getTransaction().begin();
            getEntityManager().merge(t);
            getEntityManager().getTransaction().commit();
            getEntityManager().close();
            System.out.println(classePersistente.getSimpleName() + " cadastrado com sucesso");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public final void excluir(Entidade t) {
        try {
            getEntityManager().getTransaction().begin();
            getEntityManager().merge(t);
            getEntityManager().remove(t);
            getEntityManager().getTransaction().commit();
            getEntityManager().close();
            System.out.println(classePersistente.getSimpleName() + " removido com sucesso");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<Entidade> listar() {
        try {
            String sql = "from " + classePersistente.getSimpleName();
            TypedQuery<Entidade> query = getEntityManager().createQuery(sql, classePersistente);
            List<Entidade> listar = query.getResultList();
            return listar;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public EntityManager getEntityManager() {
        return DAOFactory.createEntityManager();
    }

}
